/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package dao;

import java.util.Date;
import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.Persistence;

/**
 *
 * @author Familia Genu
 */
public class Dao<T> {

    private static EntityManager em =
            Persistence.createEntityManagerFactory("UP").createEntityManager();
    private Class classe;

    public Dao(Class classe) {
        this.classe = classe;
    }

    public void insert(T entidade) {
        em.getTransaction().begin();
        em.persist(entidade);
        em.getTransaction().commit();
    }

    public void update(T entidade) {
        em.getTransaction().begin();
        em.merge(entidade);
        em.getTransaction().commit();
    }

    public void remove(int id) {
        T entidade = get(id);
        if (entidade == null) {
            return;
        }
        em.getTransaction().begin();
        em.remove(entidade);
        em.getTransaction().commit();
    }

    public T get(int id) {
        return (T) em.find(classe, id);
    }
    
    public List<T> list() {
        return em.createQuery("SELECT e FROM " + classe.getSimpleName() + " e").getResultList();
    }

    public List<T> listByCampeonato(int campeonato) {
        return em.createQuery("SELECT e FROM " + classe.getSimpleName() + " e WHERE e.campeonato.id=" + campeonato + "").getResultList();
    }

    public List<T> listByRodadaUsuario(int rodada, String email) {
        return em.createQuery("SELECT e FROM " + classe.getSimpleName() + " e WHERE e.jogo.rodada.id=" + rodada + " AND e.usuario.email=\"" + email + "\"").getResultList();
    }

    public List<T> listByNome(String nome) {
        return em.createQuery("SELECT e FROM " + classe.getSimpleName() + " e WHERE e.nome LIKE '%" + nome + "%' ORDER BY e.nome").getResultList();
    }

    public List<T> listByApelido(String apelido) {
        return em.createQuery("SELECT e FROM " + classe.getSimpleName() + " e WHERE e.apelido LIKE '%" + apelido + "%'").getResultList();
    }

    public List<T> listByCpf(String cpf) {
        return em.createQuery("SELECT e FROM " + classe.getSimpleName() + " e WHERE e.cpf LIKE '%" + cpf + "%'").getResultList();
    }

    public List<T> listByNomeAndCpf(String nome, String cpf) {
        return em.createQuery("SELECT e FROM " + classe.getSimpleName() + " e WHERE e.nome LIKE '%" + nome + "%' OR "
                + "e.cpf LIKE '%" + cpf + "%'").getResultList();
    }

    public List<T> listByHorarioOrData(Date horario, Date data) {
        return em.createQuery("SELECT e FROM " + classe.getSimpleName() + " e WHERE e.datajogo =\'" + data + "\' OR "
                + "e.horario = \'" + horario + "\'").getResultList();
    }
    
    public List<T> listByPontuacao() {
        return em.createQuery("SELECT u FROM " + classe.getSimpleName() + " u ORDER BY u.pontos DESC").getResultList();
    }
    public List<T> listByPontuacaoAndVitorias() {
        return em.createQuery("SELECT u FROM " + classe.getSimpleName() + " u ORDER BY u.pontos, u.vitorias DESC").getResultList();
    }
    
    public List<T> listByRodadaCampeonato(int campeonato) {
        return em.createQuery("SELECT e FROM " + classe.getSimpleName() + " e WHERE e.rodada.campeonato.id=" + campeonato + "").getResultList();
    }

    public void close() {
        em.close();
    }
}
